#include "maincsv.h"
#include <QRegularExpression>
#include <QStandardPaths>
// QT6，自定义csv文件格式规则：换行符用制附表(\t)代替，逗号用[DH]代替

MainCSV::MainCSV() {
    tempFile=QStandardPaths::writableLocation(QStandardPaths::TempLocation)+"/barcode_tools_cache_20240611";
}

// 更新临时缓存到表格数据中（一般程序启动时执行）
void MainCSV::UpdateCache(QStandardItemModel *standItemModel){
    ReadCSVFile(tempFile, standItemModel);
}

// 保存表格数据到临时缓存中（一般表格数据变动时执行）
bool MainCSV::SaveCache(QStandardItemModel *standItemModel){
    return SaveCSVFile(tempFile, standItemModel);
}

// 保存表格数据到csv文件
bool MainCSV::SaveCSVFile(QString filePath, QStandardItemModel *standItemModel){
    QFile file(filePath);
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
        return 0; // 如果文件无法打开，返回false
    }
    QTextStream out(&file);
    for (int r = 0; r < standItemModel->rowCount(); ++r) {
        for (int c = 0; c < standItemModel->columnCount(); ++c) {
            auto model =standItemModel->index(r,c).data();
            if(model.isValid()){
                QString str=model.toString();
                // 换行符和逗号处理
                str.replace("\n", "\t");
                str.replace(",", "[DH]");
                out << str;
            }
            else
                out << "";
            if (c < standItemModel->columnCount() - 1) {
                out << ",";
            }
        }
        out << "\n";
    }
    file.close();
    return 1;
}

// 读取csv文件
QList<QList<QString>> MainCSV::ReadCSVFile(const QString &filePath) {
    QList<QList<QString>> csvData;
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
        qWarning() << "Cannot open file:" << filePath;
        return csvData; // 返回空的QList
    }
    QTextStream in(&file);
    QString line;
    while (!in.atEnd()) {
        line = in.readLine(); // 读取一行
        // 换行处理（\t）
        line.replace("\t", u8"\n");
        QList<QString> row = line.split(",", Qt::KeepEmptyParts);   // 使用逗号分割字符串
        // 逗号处理（[DH]）
        for (int i = 0; i < row.size(); ++i) {
            row[i].replace("[DH]", ",");
        }
        csvData.append(row);                                        // 将分割后的行添加到csvData中
    }
    file.close();
    return csvData;
}

// 读取csv文件到表格中
void MainCSV::ReadCSVFile(const QString &filePath, QStandardItemModel *standItemModel) {
    auto v_str = ReadCSVFile(filePath);
    if(v_str.empty()) return;
    standItemModel->setRowCount(v_str.size());
    standItemModel->setColumnCount(v_str[0].size());
    for (int r = 0; r < v_str.size(); ++r) {
        for (int c = 0; c < v_str[r].size(); ++c) {
            QModelIndex index = standItemModel->index(r, c);
            standItemModel->setData(index, v_str[r][c], Qt::DisplayRole);
            standItemModel->setData(index, int(Qt::AlignLeft | Qt::AlignVCenter),Qt::TextAlignmentRole);
            // 第二种方式，慢
            //standItemModel->setItem(r, c, new QStandardItem(v_str[r][c]));
        }
    }
}
